package com.xiaowu.friend.aspect;

import com.xiaowu.common.core.constants.Constants;
import com.xiaowu.common.core.enums.ResultCode;
import com.xiaowu.common.core.utils.ThreadLocalUtil;
import com.xiaowu.common.security.exception.ServiceException;
import com.xiaowu.friend.domain.user.vo.UserVO;
import com.xiaowu.friend.manager.UserCacheManager;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Aspect
@Component
public class UserStatusCheckAspect {

    @Autowired
    private UserCacheManager userCacheManager;

    /**
     * 在带有@CheckUserStatus注解的方法执行前进行用户状态检查
     * 该方法会在任何标记了@CheckUserStatus注解的方法执行前自动调用
     *
     * @param point 连接点，用于获取方法信息
     * @throws ServiceException 当用户不存在或用户被禁用时抛出
     */
    @Before(value = "@annotation(com.xiaowu.friend.aspect.CheckUserStatus)")
    public void before(JoinPoint point) {
        // 从ThreadLocal中获取当前用户ID
        Long userId = ThreadLocalUtil.get(Constants.USER_ID, Long.class);
        // 根据用户ID从缓存中获取用户信息
        UserVO user = userCacheManager.getUserById(userId);
        // 检查用户是否存在，不存在则抛出异常
        if (user == null) {
            throw new ServiceException(ResultCode.FAILED_USER_NOT_EXISTS);
        }
        // 检查用户状态是否为禁用状态，是则抛出异常
        if (Objects.equals(user.getStatus(), Constants.FALSE)) {
            throw new ServiceException(ResultCode.FAILED_USER_BANNED);
        }
    }
}
